자바스크립트 스타일 가이드
#
Airbnb 자바스크립트 스타일 가이드 2020-09-22no-whitespace-before-property 부터 eslint 레퍼런스를 읽었습니다.
파일 목록에 분류되어 있는 포스트는 eslint 를 읽고 업데이트 한 게시글 입니다.
#
Classes & Constructors#
클래스 사용 > 프로토타입 직접조작- 클래스 문법은 더 간결하고, 쉽다.
#
상속: extends 사용- extends
- instanceof를 파괴하지 않고(?TODO) 프로포타입 상속을 위한 내장 방법
#
클래스 메서드 체이닝: 메서드가 this 를 return#
클래스의 커스텀 toString() 메서드- 사용해도 되지만 성공적으로 작동하거나 사이드 이펙트가 없는지 확인해야 한다.
#
default 생성자- 빈 constructor 는 생략해도 된다.
- 빈 생성자를 가지는 클래스를 상속하는 클래스에서, 또한 빈 생성자를 가지고 있을 땐 constructor 를 써주지 않아도 된다.
#
중복된 클래스 멤버를 가지는 클래스 X- 중복된 클래스 멤버 선언은. 클래스 멤버를 사용할 때 마지막 것을 선택한다.
- 중복된 클래스 멤버를 가질 수 있는 것은 버그이다.
#
클래스 메서드에서 this 를 사용하지 않을 경우 : static 메서드 사용#
Modules#
(import/export) > non-standard 모듈 시스템.- (import/export) 를 쓰면 원하는 모듈 시스템으로 트랜스파일링 할 수 있다.
#
* wildcard import X- default Export 인지 named export 인지 헷갈릴 수 있다.
#
from 으로 Import 후 직접적인 export X- 간결하지만, export / import 의 일관성을 위해 분리한다.
#
하나의 path : 하나의 import- 하나의 path 에서 여러개의 import 를 쓴다면 유지보수가 어렵다.
#
mutable: export X- 특수한 경우를 제외하고 상수 reference 만 export 한다.
#
모듈에 export 가 하나만 있을 때: export default > named export- 파일에 하나의 export 를 권장
- 가독성, 유지보수에 낫다.
#
모든 import 는 non-import 명령문 위에 두기- import 는 호이스팅 된다.
- 호이스팅이 되는 것들은 아래에 두었을때 문제가 발생할 가능성이 있다는 말?
#
여러줄의 imports : 들여쓰기(indent)#
import 문: Webpack loader 구문 X- import 에서 webpack 구문을 사용하면 코드를 모듈 번들러에 연결한다 (TODO 웹팩에 대한 지식 부족..)
- webpack.config.js 에서 로더 구문을 사용하는 것이 좋다.
#
import/extensions : 자바스크립트 파일이름 extensions X- extensions 포함의 문제점.
- 리팩토링이 금지된다.
- (? TODO .js -> .jsx .. 등 js 관련 확장자를 다 수정해 줘야하는 문제점?)
- 리팩토링이 금지된다.
#
Iterators and Generators#
이터레이터 사용: 고차 함수 > 루프 for-in / for-of- 고차 함수
- 불변 규칙을 강제하기 위함이다.
- 값을 리턴하는 순수 함수를 다루는 것이 더 쉽기 때문에 사이드 이펙트도 작을 수 있음.
- 배열 순회
- map()
- every()
- filter()
- find()
- findIndex()
- reduce()
- some() / ...
- 객체 -> 배열
- Object.keys()
- Object.values()
- Object.entries()
#
현재 제너레이터는 ES5 트랜스파일링이 잘 되지 않는다.#
제너레이터의 연산자의 적절한 공백 : function foo()- function, * -> 같은 개념적 키워드
- 는 함수에 대한 수정자가 아님
- function * 은 함수와 다른 고유 한 구성임 ??
#
Properties#
프로퍼티 접근: dot 표기법 사용#
변수로 프로퍼티 접근 : [] 사용#
지수 연산 : ** > Math.pow#
Variables#
변수 선언 : 항상 const / let- const / let
- 전역 변수가 생성되지 않는다.
- 전역 변수 공간을 어지럽히면 안된다.
#
하나의 변수 선언/할당 : 하나의 const/let- 새로 변수를 선언하고 추가할 때 더 쉽다.
- 하나의 const/let 에 여러 변수를 나열하면, ; 와 , 을 고려해야 한다.
- 디버그를 할 때, 한줄로 쓰면 한번에 뛰어넘는다.
- 단계별로 관찰 할 수 없다.
#
const/ let 의 그룹화- 그룹화는, 나중에 이전에 할당 된 변수 중 하나에 따라 변수를 할당해야 할 때 유용합니다. (?TODO)
#
합리적인 위치에 변수할당문 사용- 필요한 위치 근처에 둔다.
- let/const 은 block 스코프 이기 때문임.
#
변수 할당문의 체이닝 X- 변수 할당문의 체이닝은 암묵적으로 글로벌 변수를 만들어 낸다.
#
단항 증감 (++, --) X- 단항 증감은 세미콜론 자동 삽입의 대상이 된다.
- silent errors 의 원인이 될 수 있다.
num++
/num ++
보다num += 1
이 더 바람직하다.- 단항 증감을 사용하지 않으면,
- pre-incrementing/pre-decrementing 실수를 방지할 수 있다.
#
= 할당문 전후로 줄바꿈 X, 줄바꿈이 필요하다면 () 사용- 할당문 전후로 줄바꿈이 발생하면 난독화를 일으킬 수 있다.
#
사용하지 않은 변수는 비허용된다.- 선언되었지만 사용되지 않은 변수는 리팩토링이 완전하게 되지 않았다는 의미이다.
- 코드 공간을 불필요하게 차지함.
- 읽는 사람에게 혼동을 줌.
#
Hoisting#
var, const/let 선언의 호이스팅:- var
- 선언문은 가장 가까운 함수 스코프의 최상단으로 호이스팅 된다.
- 할당문은 호이스팅 되지 않는다.
- const/let
- 선언에는 Temporal Dead Zones (TDZ) 가 존재한다.
typeof
는 안전하지 않다. (예시 참고)
#
14.2 익명함수 표현식의 호이스팅 : 변수 이름 O, 함수할당 X#
이름있는 함수 표현식의 호이스팅: 변수이름 O, 함수이름과 body X#
함수 선언문의 호이스팅: 함수 이름, body O#
Comparison Operators & Equality#
(===) (!==) > (==)#
Conditional statementsif
와 같은 조건문
ToBoolean
의 추상 메서드로 강제변환을 사용하여 식을 평가한다.- 식을 평가하는 규칙은 다음과 같다.
- Objects -> true
- Undefined -> false
- Null -> false
- Booleans -> true / false
- Numbers
- false : +0, -0, NaN
- otherwise true
- Strings
- false : empty string ''
- otherwise true
#
reference: boolean -> 축약 , 문자열/숫자 -> 명시적 비교🔗#
Truth Equality and JavaScript by Angus Croll.#
어휘 선언이 있는 case/default 문 : { } braces 사용- Lexical declarations [어휘 선언]
- let, const, function, and class
- 스위치 블록 스코프가 존재한다.
- case/default 에 { } 가 없다면 여러 case 절에서 동일한 것을 정의하려고 할 때 문제가 발생함.
#
삼항의 중첩 X : 기본적으로 단일행 표현식#
불필요한 삼항 표현식 X#
혼합 연산자 : () 로 감싸기- 혼합연산자는 우선순위가 모호할 수 있다.
- +, -, ** 는 예외
- /, * 는 모호 하다.
#
Blocks#
여러줄의 블록 : {} 사용#
if/else 여러줄 블록 : if 의 닫기 } 와 같은 줄에 else 두기#
return 을 포함하는 if 블록 + else/else if- return 을 포함하는 if 블록
- 후속 else 불필요
- 후속 else if 의 리턴 -> if 리턴으로 분리
#
Control Statements- if, while etc
#
제어문의 아주 긴 조건 : 줄바꿈, 논리연산은 새 줄에 시작- 연산을 새 줄에 시작하는 것
- 메서드 체이닝 패턴
- 가독성
#
제어문 > 선택 연산자#
Comments#
멀티라인 주석 /* ... / > //#
// : 한줄 주석- 주석의 대상 위에 한줄로 표기
- 주석 위에는 한 줄 비우기
- 주석이 블록이 첫줄이 아닌경우 제외
#
주석의 시작은 항상 공백- 가독성
#
FIXME / TODO- 실행 가능한 주석
- FIXME: 재검토해야 할 문제를 지적
- TODO: 구현해야하는 문제
#
Whitespace#
들여쓰기 indent : 2 space character#
space-before-blocks: 여는 { 의 앞에 공백 하나#
keyword-spacing : 제어문과 함수의 호출/선언- 제어문 : 여는 ( 앞에 공백 하나
- 함수 호출/선언: 여는 ( 앞에 공백 X
#
space-infix-ops : 연산자 사이 공백#
eol-last : 파일 마지막 - 하나의 newline(개행) 문자로 끝내기- 비어 있지 않은 파일의 후행 줄 바꿈은 일반적인 UNIX 관용구입니다.
- 후행 줄 바꿈의 이점은 쉘 프롬프트를 방해하지 않고 파일 및 출력 파일을 터미널에 연결하거나 추가하는 기능을 포함합니다.
#
newline-per-chained-call 체이닝 마다 개행- 긴 메서드 체이닝 (2개이상)
- 들여쓰기
- . dot 으로 시작하기
- . 으로 시작하는 것 새로운 문이 아닌 메서드 호출이라는 것을 강조할 수 있다.
🔗 프로퍼티 앞에 공백 X#
no-whitespace-before-property- javascript 는 객체와 속성 사이의 공백을 허용한다.
- 가독성을 저하하고 오류를 유발할 수 있다.
- 점 주위 (), [] 괄호 앞에 공백을 쓰지 않아야 된다.
- 체이닝의 개행에서만 허용 한다.
#
블록 다음/ 다음 statement 앞 : 빈 줄#
padded-blocks: 블록을 빈 줄로 채우지 말것#
no-multiple-empty-lines: 멀티라인 빈줄 X- 공백은 코드의 논리적 섹션을 분리하는데 유용하지만 과도한 공백은 화면을 더 많이 차지 한다.
- 코드를 읽을 때 필요한 스크롤을 줄이는 것을 목표로 한다.
#
space-in-parens : ( ) 안에 공백 X#
array-bracket-spacing : [ ] 안에 공백 X#
object-curly-spacing : { } 안에 공백 O#
한줄에 100 자(공백 포함) 이상 X#
block-spacing : { 와 } 가 같은줄 : braces 내부 전후로 공백#
comma-spacing : , 전에 공백 X / , 후 공백 O#
computed-property-spacing : 공백의 일관성- 계산된 속성 : 공백을 넣거나 빼거나 둘중 하나로 통일해야 한다.
#
func-call-spacing : 함수 호출 공백 X#
key-spacing : 키 공백- 개체 리터럴 속성에서 키와 값 사이의 간격
- 키는 붙이고 value 는 띄운다.
#
no-trailing-spaces : 줄 끝 후행 공백 X- 후행 공백 : 공백, 탭 및 기타 유니 코드 공백 문자
- 소스 제어 시스템에서 diff 로 플래그가 지정되는 문제점.
#
no-multiple-empty-lines : 빈 멀티라인 X- 오직 파일 끝 한줄의 개행 문자만 허용됨.
- 파일 시작에 개행 문자 X
#
Commas#
Reference & Originhttps://github.com/airbnb/javascript 있는 포스트는 eslint 를 읽고 업데이트 한 게시글 입니다.
#
Arrays#
배열 생성: 리터럴 문법 []#
배열의 items 생성 : push#
배열 복사 : ... spread operator#
iterable 객체 -> 배열 : spreads ... > Array.from.iterable 객체
document.querySelectorAll('.foo')
의 __proto__
는 NodeList
#
array-like 객체 -> 배열 : Array.fromlength
프로퍼티가 존재.- index 번호가 0번부터 시작해서 1씩증가.
#
iterable map : Array.from > spread ...Array.from 은 중간에 배열을 생성하는 것을 방지한다.
#
배열 메서드의 callback 에서 return 문을 사용해야 한다#
여러 줄이있는 배열의 줄바꿈: 괄호를 열때, 닫기전 사용#
Destructuring#
객체 다중 프로퍼티 사용 : destructuring- 임시 references 생성을 줄여준다.
#
배열 destructuring#
리턴값이 여러개 일 때 : 객체 비구조화 > 배열 비구조화- 객체 비구조화는, 추후에 코드에 새 속성을 추가 할 수 있다.
- 리턴 값을 순서에 상관없이 가져올 수 있다.
- 호출 할 때, 원하는 data 를 선택할 수 있다.
#
Strings#
문자열: single quotes ''#
100 자가 넘는 문자열: \,+ 으로 끊지 말것.- 끊어진 문자열 : 작업하기가 힘들고 코드를 검색하기 어렵게 만든다.
#
계산된 문자열을 만들 때 : 탬플릿 스트링 > +- Template 스트링
- 가독성
- 줄 바꿈 -> 엔터
- interpolation
{something}
( 블록이 아님)
#
문자열 eval() 사용 말것 : 많은 취약점#
문자열 escape characters : Backslashes -> template string- Backslashes 은 가독성 저하
- template string 으로 backslash 를 줄일 수 있다.
#
Functions#
이름있는 함수 표현식 > 함수 선언식- 함수 선언식
- 함수 선언이 호이스트된다. (TODO airbnb 스타일 가이드에서의 호이스팅의 의미가 다른가?)
- 파일에서 함수가 정의되기 전에 함수를 참조할 수 있다
- 가독성과 유지 보수성을 해친다.
- 함수의 정의가 파일의 나머지 부분을 이해하는 데 방해가 될만큼 충분히 크거나 복잡하다면 -> 모듈로 추출
- 이름있는 함수 표현식
- This eliminates any assumptions made about the Error’s call stack.
- 에러 콜스택에서의 가정(유추해야 하는일)을 없앤다? 에러를 더 잘찾아낼 수 있다라는 의미로 해석.
#
IIFE: parentheses 으로 감싸기- 모듈 시스템에서의 IIFE 는 거의 사용되지 않는다.
#
비함수블럭에서 함수 선언 X -> 변수에 함수 할당.- non-function block :
if, while
, etc - 브라우저마다 비함수블럭에서의 함수블럭 해석을 다르게 한다.
#
ECMA-262, block : statements(명령문), 함수선언 : not statements#
매개변수에 arguments 사용 X- 함수의 arguments 프로퍼티보다 매개변수의 arguments 가 우선시 된다.
#
rest syntax ... > arguments X- 함수에서 arguments 은 절대 사용하지 말것.
- 나머지 인수는 유사배열이 아닌 실제 배열이다.
#
default parameter syntax > 함수 인자 변경#
사이드 이펙트를 유발하는 default parameter 사용 말것.#
default parameters 는 마지막에 적는다.#
함수 객체 생성 : 함수 생성자 X- 생성자로 함수 생성
- 문자열을 'eval()' 와 유사하게 평가한다. (TODO 'return a + b' 이 eval 와 유사하게 평가될 수 있다는 의미인가?)
- 취약점
#
함수 시그니처의 space 유지- 함수시그니처
- functions 그리고 methods 의 입력과 출력을 정의
- 일관성
- 이름 추가/제거 -> 공백 추가/제거 의 동작을 안해도됨
#
매개 변수로 전달 된 객체 조작 금지- 함수의 (original)caller 에게 변수 부작용의 가능성.
#
매개변수 재할당 금지- 매개변수 재할당
- arguments 객체 접근 -> 예기치 않은 행동 발생
- 최적화 이슈, especially in V8.
#
가변 함수 : spread operator ... > apply- variadic functions (가변 함수)
- 가변 개수의 인수 허용
- apply 메서드로 context(this) 를 제공해 줄 필요 없어 깨끗하다.
- apply 메서드를 한번 더 적용하기 힘들다.
#
함수의 여러줄의 시그니쳐/호출 : 들여쓰기, 한줄에 하나씩#
Arrow Functions#
익명 함수: 화살표함수 사용- 익명 함수를 사용해야 할 때 중 하나는 인라인 콜백(inline callback)을 사용할 때 이다.
- 화살표 함수의 함수의 실행 문맥(this)은 함수를 호출한 곳의 컨텍스트(this) 를 이어받을 수 있다.
- 만약 function 키워드를 사용한 익명함수를 인라인 콜백에서 썼을 경우의 this 는 실행컨텍스트를 예측하기가 어렵다.
- 화살표 함수는 간결하다.
- 만약 인라인 콜백이 복잡하여 졌을 때, 콜백의 로직을 함수 외부에 선언하는 작업이 필요해 질 것이다.
- 이 때 외부에서, reference 에 함수 표현식을 할당하면, 인라인 콜백 대신 reference 로 대신할 수 있다.
#
명령문이 1개인 화살표 함수 : 중괄호 생략 -> 암시적 반환- 중괄호를 사용해야 하는경우 반환을 하기 위해선 return 문을 써야 한다.
- Syntactic sugar : 가독성
#
여러줄로 이뤄진 1개의 명령문의 암시적 반환: () 으로 감싼다.- 함수의 시작과 끝을 명확히 할 수 있다.
#
화살표 함수의 인자: 항상 () 로 감싸기- 명확성, 일관성
- 새로운 인자를 첨삭할 때 () 의 변동을 줄여준다.
x
->(x, y)
, 혹은 그 반대를 하면 () 의 변동이 있다.
#
화살표함수의 (=>) 와 비교 연산자 (<=, >=) 의 혼동 : 명령문을 () 로 감싼다.#
암시적 반환할 때, body 의 위치#
Classes & Constructors#
클래스 사용 > 프로토타입 직접조작- 클래스 문법은 더 간결하고, 쉽다.
#
상속: extends 사용- extends
- instanceof를 파괴하지 않고(?TODO) 프로포타입 상속을 위한 내장 방법
#
클래스 메서드 체이닝: 메서드가 this 를 return#
클래스의 커스텀 toString() 메서드- 사용해도 되지만 성공적으로 작동하거나 사이드 이펙트가 없는지 확인해야 한다.
#
default 생성자- 빈 constructor 는 생략해도 된다.
- 빈 생성자를 가지는 클래스를 상속하는 클래스에서, 또한 빈 생성자를 가지고 있을 땐 constructor 를 써주지 않아도 된다.
#
중복된 클래스 멤버를 가지는 클래스 X- 중복된 클래스 멤버 선언은. 클래스 멤버를 사용할 때 마지막 것을 선택한다.
- 중복된 클래스 멤버를 가질 수 있는 것은 버그이다.
#
클래스 메서드에서 this 를 사용하지 않을 경우 : static 메서드 사용#
Modules#
(import/export) > non-standard 모듈 시스템.- (import/export) 를 쓰면 원하는 모듈 시스템으로 트랜스파일링 할 수 있다.
#
* wildcard import X- default Export 인지 named export 인지 헷갈릴 수 있다.
#
from 으로 Import 후 직접적인 export X- 간결하지만, export / import 의 일관성을 위해 분리한다.
#
하나의 path : 하나의 import- 하나의 path 에서 여러개의 import 를 쓴다면 유지보수가 어렵다.
#
mutable: export X- 특수한 경우를 제외하고 상수 reference 만 export 한다.
#
모듈에 export 가 하나만 있을 때: export default > named export- 파일에 하나의 export 를 권장
- 가독성, 유지보수에 낫다.
#
모든 import 는 non-import 명령문 위에 두기- import 는 호이스팅 된다.
- 호이스팅이 되는 것들은 아래에 두었을때 문제가 발생할 가능성이 있다는 말?
#
여러줄의 imports : 들여쓰기(indent)#
import 문: Webpack loader 구문 X- import 에서 webpack 구문을 사용하면 코드를 모듈 번들러에 연결한다 (TODO 웹팩에 대한 지식 부족..)
- webpack.config.js 에서 로더 구문을 사용하는 것이 좋다.
#
import/extensions : 자바스크립트 파일이름 extensions X- extensions 포함의 문제점.
- 리팩토링이 금지된다.
- (? TODO .js -> .jsx .. 등 js 관련 확장자를 다 수정해 줘야하는 문제점?)
- 리팩토링이 금지된다.
#
Iterators and Generators#
이터레이터 사용: 고차 함수 > 루프 for-in / for-of- 고차 함수
- 불변 규칙을 강제하기 위함이다.
- 값을 리턴하는 순수 함수를 다루는 것이 더 쉽기 때문에 사이드 이펙트도 작을 수 있음.
- 배열 순회
- map()
- every()
- filter()
- find()
- findIndex()
- reduce()
- some() / ...
- 객체 -> 배열
- Object.keys()
- Object.values()
- Object.entries()
#
현재 제너레이터는 ES5 트랜스파일링이 잘 되지 않는다.#
제너레이터의 연산자의 적절한 공백 : function foo()- function, * -> 같은 개념적 키워드
- 는 함수에 대한 수정자가 아님
- function * 은 함수와 다른 고유 한 구성임 ??
#
Properties#
프로퍼티 접근: dot 표기법 사용#
변수로 프로퍼티 접근 : [] 사용#
지수 연산 : ** > Math.pow#
Variables#
변수 선언 : 항상 const / let- const / let
- 전역 변수가 생성되지 않는다.
- 전역 변수 공간을 어지럽히면 안된다.
#
하나의 변수 선언/할당 : 하나의 const/let- 새로 변수를 선언하고 추가할 때 더 쉽다.
- 하나의 const/let 에 여러 변수를 나열하면, ; 와 , 을 고려해야 한다.
- 디버그를 할 때, 한줄로 쓰면 한번에 뛰어넘는다.
- 단계별로 관찰 할 수 없다.
#
const/ let 의 그룹화- 그룹화는, 나중에 이전에 할당 된 변수 중 하나에 따라 변수를 할당해야 할 때 유용합니다. (?TODO)
#
합리적인 위치에 변수할당문 사용- 필요한 위치 근처에 둔다.
- let/const 은 block 스코프 이기 때문임.
#
변수 할당문의 체이닝 X- 변수 할당문의 체이닝은 암묵적으로 글로벌 변수를 만들어 낸다.
#
단항 증감 (++, --) X- 단항 증감은 세미콜론 자동 삽입의 대상이 된다.
- silent errors 의 원인이 될 수 있다.
num++
/num ++
보다num += 1
이 더 바람직하다.- 단항 증감을 사용하지 않으면,
- pre-incrementing/pre-decrementing 실수를 방지할 수 있다.
#
= 할당문 전후로 줄바꿈 X, 줄바꿈이 필요하다면 () 사용- 할당문 전후로 줄바꿈이 발생하면 난독화를 일으킬 수 있다.
#
사용하지 않은 변수는 비허용된다.- 선언되었지만 사용되지 않은 변수는 리팩토링이 완전하게 되지 않았다는 의미이다.
- 코드 공간을 불필요하게 차지함.
- 읽는 사람에게 혼동을 줌.
#
Hoisting#
var, const/let 선언의 호이스팅:- var
- 선언문은 가장 가까운 함수 스코프의 최상단으로 호이스팅 된다.
- 할당문은 호이스팅 되지 않는다.
- const/let
- 선언에는 Temporal Dead Zones (TDZ) 가 존재한다.
typeof
는 안전하지 않다. (예시 참고)
#
14.2 익명함수 표현식의 호이스팅 : 변수 이름 O, 함수할당 X#
이름있는 함수 표현식의 호이스팅: 변수이름 O, 함수이름과 body X#
함수 선언문의 호이스팅: 함수 이름, body O#
Comparison Operators & Equality#
(===) (!==) > (==)#
Conditional statementsif
와 같은 조건문
ToBoolean
의 추상 메서드로 강제변환을 사용하여 식을 평가한다.- 식을 평가하는 규칙은 다음과 같다.
- Objects -> true
- Undefined -> false
- Null -> false
- Booleans -> true / false
- Numbers
- false : +0, -0, NaN
- otherwise true
- Strings
- false : empty string ''
- otherwise true
#
reference: boolean -> 축약 , 문자열/숫자 -> 명시적 비교🔗#
Truth Equality and JavaScript by Angus Croll.#
어휘 선언이 있는 case/default 문 : { } braces 사용- Lexical declarations [어휘 선언]
- let, const, function, and class
- 스위치 블록 스코프가 존재한다.
- case/default 에 { } 가 없다면 여러 case 절에서 동일한 것을 정의하려고 할 때 문제가 발생함.
#
삼항의 중첩 X : 기본적으로 단일행 표현식#
불필요한 삼항 표현식 X#
혼합 연산자 : () 로 감싸기- 혼합연산자는 우선순위가 모호할 수 있다.
- +, -, ** 는 예외
- /, * 는 모호 하다.
#
Blocks#
여러줄의 블록 : {} 사용#
if/else 여러줄 블록 : if 의 닫기 } 와 같은 줄에 else 두기#
return 을 포함하는 if 블록 + else/else if- return 을 포함하는 if 블록
- 후속 else 불필요
- 후속 else if 의 리턴 -> if 리턴으로 분리
#
Control Statements- if, while etc
#
제어문의 아주 긴 조건 : 줄바꿈, 논리연산은 새 줄에 시작- 연산을 새 줄에 시작하는 것
- 메서드 체이닝 패턴
- 가독성
#
제어문 > 선택 연산자#
Comments#
멀티라인 주석 /* ... / > //#
// : 한줄 주석- 주석의 대상 위에 한줄로 표기
- 주석 위에는 한 줄 비우기
- 주석이 블록이 첫줄이 아닌경우 제외
#
주석의 시작은 항상 공백- 가독성
#
FIXME / TODO- 실행 가능한 주석
- FIXME: 재검토해야 할 문제를 지적
- TODO: 구현해야하는 문제
#
Whitespace#
들여쓰기 indent : 2 space character#
space-before-blocks: 여는 { 의 앞에 공백 하나#
keyword-spacing : 제어문과 함수의 호출/선언- 제어문 : 여는 ( 앞에 공백 하나
- 함수 호출/선언: 여는 ( 앞에 공백 X
#
space-infix-ops : 연산자 사이 공백#
eol-last : 파일 마지막 - 하나의 newline(개행) 문자로 끝내기- 비어 있지 않은 파일의 후행 줄 바꿈은 일반적인 UNIX 관용구입니다.
- 후행 줄 바꿈의 이점은 쉘 프롬프트를 방해하지 않고 파일 및 출력 파일을 터미널에 연결하거나 추가하는 기능을 포함합니다.
#
newline-per-chained-call 체이닝 마다 개행- 긴 메서드 체이닝 (2개이상)
- 들여쓰기
- . dot 으로 시작하기
- . 으로 시작하는 것 새로운 문이 아닌 메서드 호출이라는 것을 강조할 수 있다.
🔗 프로퍼티 앞에 공백 X#
no-whitespace-before-property- javascript 는 객체와 속성 사이의 공백을 허용한다.
- 가독성을 저하하고 오류를 유발할 수 있다.
- 점 주위 (), [] 괄호 앞에 공백을 쓰지 않아야 된다.
- 체이닝의 개행에서만 허용 한다.
#
블록 다음/ 다음 statement 앞 : 빈 줄#
padded-blocks: 블록을 빈 줄로 채우지 말것#
no-multiple-empty-lines: 멀티라인 빈줄 X- 공백은 코드의 논리적 섹션을 분리하는데 유용하지만 과도한 공백은 화면을 더 많이 차지 한다.
- 코드를 읽을 때 필요한 스크롤을 줄이는 것을 목표로 한다.
#
space-in-parens : ( ) 안에 공백 X#
array-bracket-spacing : [ ] 안에 공백 X#
object-curly-spacing : { } 안에 공백 O#
한줄에 100 자(공백 포함) 이상 X#
block-spacing : { 와 } 가 같은줄 : braces 내부 전후로 공백#
comma-spacing : , 전에 공백 X / , 후 공백 O#
computed-property-spacing : 공백의 일관성- 계산된 속성 : 공백을 넣거나 빼거나 둘중 하나로 통일해야 한다.
#
func-call-spacing : 함수 호출 공백 X#
key-spacing : 키 공백- 개체 리터럴 속성에서 키와 값 사이의 간격
- 키는 붙이고 value 는 띄운다.
#
no-trailing-spaces : 줄 끝 후행 공백 X- 후행 공백 : 공백, 탭 및 기타 유니 코드 공백 문자
- 소스 제어 시스템에서 diff 로 플래그가 지정되는 문제점.
#
no-multiple-empty-lines : 빈 멀티라인 X- 오직 파일 끝 한줄의 개행 문자만 허용됨.
- 파일 시작에 개행 문자 X
#
Commas#
comma-style: 컴마로 시작 X#
comma-dangle : 마지막행 쉼표 -> 깨끗한 diff- babel 과같은 트랜스컴파일러도 추가 후행쉼표를 제거해 준다.
#
Semicolons#
semi 로 명시적으로 명령문 종료- JavaScript 는 각 문 끝에 세미콜론이 필요하지 않음
- 자동 세미콜론 삽입 (ASI): 대부분 JS 엔진, 세미콜론 위치 판단 -> 자동 추가
- ASI 몇 가지 특이한 동작 -> 잘못 해석하면 코드가 깨진다.
- ASI 의 시기를 알고, ESLint 가 이러한 잠재적으로 예상치 못한 경우로부터 코드를 보호하도록하는 것이 가장 좋습니다.
\n
문자는 아래에 해당하지 않을 때 세미콜론을 붙인다.- 닫히지 않은 괄호 :
(
,[
,{
paren, array literal, or object literal .
,,
로 끝남- 다음 토큰을 증가/감소 하는
--
/++
{
가 없는 :for()
,while()
,do
,if()
,else
:- 다음 줄이
[
,(
,+
,*
,/
,-
,,
,.
, 으로 시작할 때 - some other binary operator that can only be found between two tokens in a single expression.
- single expression 에서, 두 토큰 사이의 이항 연산자(?)
- 닫히지 않은 괄호 :
#
Type Casting & Coercion타입 캐스팅 & 강제 형변환
#
명령문의 시작부분에서 강제 형변환 하기#
no-new-wrappers : Strings원시형 래퍼 타입 : String, Number, Boolean 사용
- 메서드와 같은 객체와 유사한 기능을 제공
var text = "Hello world".substring(2);
- 연관된 래퍼 유형의 객체가 생성 된 다음 소멸된다.
new wrapper instance
new wrapper String, Number, Boolean 를 사용하지 않는 것에 대한 사례
#
no-new-wrappers : Numbers#
성능 Bitshift > parseInt#
bitshift 주의점- Numbers 는 64 bit 값
- bitshift 는 32 bit integer 를 리턴함.
- 32 bit Int, 2,147,483,647 보다 더 큰 값에서 예상치 못한 값으로 변환됌.
#
no-new-wrappers : Booleans#
Naming Conventions#
id-length : 이름 설명 > 한글자 이름#
camelcase : naming objects, functions, instances.#
new-cap : 생성자 & 클래스 이름에만 PascalCase 사용#
no-underscore-dangle : 후행/선행 밑줄 X- 자바 스크립트는 속성이나 방법 측면에서 프라이버시 개념이 없다
- 선행 밑줄은 "비공개"를 의미하는 일반적인 규칙이지만 실제로 이러한 속성은 완전히 공개되어 있다.
- 이 규칙은 개발자가 변경 사항이 'breaking' 으로 간주되지 않거나 테스트가 필요하지 않다고 잘못 생각하게 만들 수 있다.
- tl; dr : "비공개"상태를 원하는 경우 눈에 띄게 표시되지 않아야합니다.
#
Function#bind : 화살표 함수 > reference 에 this 저장#
default export as filename#
camelCase : export-default a 함수#
PascalCase : export a 생성자 / 클래스 / singleton / 함수 라이브러리 / bare object#
줄임말 / 이니셜 : 모두 대문자/소문자 일치#
optionally uppercase : export / const / can trust it to never change- UPPERCASE_VARIABLES 는 프로그래머에게 변수 (및 해당 속성)가 변경되지 않도록 신뢰할 수 있음을 알려줌
- exported 상수 외, 파일 내 상수에는 대문자를 사용하지 마십시오.
- exported objects, 대문자를 사용하고 모든 중첩 속성이 변경되지 않도록 유지합니다.
#
Accessors#
프로퍼티에 대한 접근자 함수는 불필요#
getters/setters -> unexpected side effects, test, maintain접근자 함수 만들기
#
isVal() or hasVal() : boolean property/method#
일관성 있는 get() and set() functions#
Events#
이벤트에 data payload 추가 : object literal(hash) > raw value이벤트 페이로드에 더 많은 데이터를 추가 할 수 있습니다.
Standard Library#
Standard Library 는 기능적으로 손상되었지만 레거시 이유로 남아 있는 utilities 를 가지고 있다.
#
no-restricted-globals : Number.isNaN > global isNaN- global isNaN
- non-numbers 를 numbers 로 강제 변환 한다.
- NaN을 강제하는 모든 것에 대해 true 를 반환
#
no-restricted-globals : Number.isFinite > global isFinite- global isFinite
- non-numbers 를 numbers 로 강제 변환 한다.
- 유한 수로 강제되는 모든 것에 대해 true 를 반환
#
TestingNo, but seriously
- 많은 작은 순수 함수를 작성, mutation 이 발생하는 위치를 최소화
- stubs / mocks 에 주의하기 - 테스트를 더 취약하게 만들 수 있음
- Airbnb 는 주로 mocha / jest 사용, tape : 가끔 작은 개별 모듈에서 사용됨
- 100 % 테스트 커버리지는 도달하기가 항상 실용적이지는 않더라도 노력하기에 좋은 목표입니다.
- 버그를 수정할 때마다 회귀 테스트를 작성하십시오. 회귀 테스트없이 수정 된 버그는 거의 확실하게 향후 다시 break 될 것입니다.
#
Reference & Originhttps://github.com/airbnb/javascript